#include <sys/sys.h>
#include <led/led.h>

TIM_HandleTypeDef timer3_handler;

/**
 * 通用定时器3初始化
 * arr: 自动重装值, psc: 时钟预分频系数
 * 定时器溢出时间计算方法: Tout=((arr+1)*(psc+1))/Ft us
 * Ft是定时器工作频率, 单位:MHz
 * 这里使用的是定时器3, 定时器3挂在APB1上, 时钟为HCLK/2,, 108MHz, 定时器频率就是HCLK/2/(psc+1)
 * 
 */
void timer_init()
{
	timer3_handler.Instance = TIM3;
	timer3_handler.Init.Prescaler = 10799;						// 分频系数
	timer3_handler.Init.CounterMode = TIM_COUNTERMODE_UP;		// 向上计数
	timer3_handler.Init.Period = 4999;							// 自动装载值
	timer3_handler.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; // 时钟分频因子

	HAL_TIM_Base_Init(&timer3_handler);		// 定时器初始化
	HAL_TIM_Base_Start_IT(&timer3_handler); // 使能更新中断, 使能tim3定时器
}

/**
 * 定时器底层驱动, 开启中断, 设置中断优先级
 * 会被HAL_TIM_Base_Init调用
 */
void HAL_TIM_Base_MspInit(TIM_HandleTypeDef *htim)
{
	__HAL_RCC_TIM3_CLK_ENABLE();		   // 使能TIM3时钟
	HAL_NVIC_SetPriority(TIM3_IRQn, 1, 3); // 设置中断优先级
	HAL_NVIC_EnableIRQ(TIM3_IRQn);		   // 开启TIM3中断
}

// TIM3的中断服务程序
void TIM3_IRQHandler(void)
{
	HAL_TIM_IRQHandler(&timer3_handler);
}

// 更新中断
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
	if (htim->Instance == TIM3)
	{
		LED0_Toggle;
		// LED1_Toggle;
	}
}
